package Snake.phototool;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.*;

public class GamePane1 extends JPanel implements KeyListener, ActionListener {

    //定义一条蛇的基本信息
    int lenth;      //蛇的长度
    int[] snakeX = new int[600];        //蛇的坐标X
    int[] snakeY = new int[500];        //蛇的坐标Y

    String fx = "R";    //R:右   L:左    U:上   D:下

    //定义食物
    int foodx;
    int foody;
    Random random= new Random();

    boolean isStart = false;        //游戏是否开始

    Timer timer = new Timer(300,this);  //定时器

    //重写构造方法
    public GamePane1(){
        init();       //调用init方法
        //获取键盘的监听
        this.setFocusable(true);        //让键盘焦点聚集在游戏上
        this.addKeyListener(this);    //添加监听，即当前这个类
        timer.start();      //让时间动起来
    }

    //初始化 蛇的身体及食物
    public void init(){
        lenth = 3;
        snakeX[0]=100;snakeY[0]=100;    //头部坐标
        snakeX[1]=75;snakeY[1]=100;    //第一个身体坐标
        snakeX[2]=50;snakeY[2]=100;    //第二个身体坐标

        //生成食物坐标
       foodx = 25 + 25 * random.nextInt(34);
       foody = 75 + 25 * random.nextInt(24);

    }

    //画板：画界面，画蛇，画食物
    //重写父类方法
    protected void paintComponent(Graphics g){
        super.paintComponent(g);        //清屏
        this.setBackground(Color.BLACK);    //设置面板背景颜色
        g.fill3DRect(25,75,850,600,true);   //绘制游戏面板

        //判断小蛇移动的头部图片
        if (fx.equals("R")){
            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (fx.equals("L")){
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (fx.equals("U")){
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (fx.equals("D")){
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
        }



        //蛇身长度
        for (int i =1;i< lenth;i++){
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i] );   //蛇的身体长度通过lenth控制
        }

        //游戏提示：是否开始
        if(isStart==false){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);
        }

        //把食物画上去
        Data.food.paintIcon(this,g,foodx,foody);


    }


    //键盘按下，未释放
    //获取键盘操作
    @Override
    public void keyPressed(KeyEvent e) {
        //获取按下的键盘是那个键
        int keyCode = e.getKeyCode();

        //按下空格使游戏开始
        if (keyCode==KeyEvent.VK_SPACE){
            isStart = !isStart;
            repaint();//刷新界面
        }

        //键盘控制走向
        if (keyCode==KeyEvent.VK_LEFT){
            fx="L";
        }else if (keyCode==KeyEvent.VK_RIGHT){
            fx="R";
        }else if (keyCode==KeyEvent.VK_UP){
            fx="U";
        }else if (keyCode==KeyEvent.VK_DOWN){
            fx="D";
        }

    }


    //定时器，执行定时操作
    // 游戏运行的操作   完成小蛇移动控制及吃食物
    @Override
    public void actionPerformed(ActionEvent e) {
        //如果游戏处于开始状态
        if (isStart){
            //右移
            //除了脑袋，身体向前移动
            for (int i=lenth -1;i>0;i--){
                snakeX[i] = snakeX[i-1];
                snakeY[i] = snakeY[i-1];
            }

            //通过控制方向让头部移动
            if (fx.equals("R")){
                snakeX[0]=snakeX[0]+25;            //小蛇移动
                if (snakeX[0]>850){snakeX[0]=25;} //边界判断
            }else if (fx.equals("L")) {
                snakeX[0]=snakeX[0]-25;             //小蛇移动
                if (snakeX[0]<25){snakeX[0]=850;}    //边界判断
            } else if (fx.equals("U")) {
                snakeY[0] = snakeY[0]-25;            //小蛇移动
                if (snakeY[0]<75){snakeY[0]=650;}   //边界判断
            }  else if (fx.equals("D")){
                snakeY[0]=snakeY[0]+25;            //小蛇移动
                if (snakeY[0]>650){snakeY[0]=75;}   //边界判断
            }

            //判断小蛇是否吃到食物
            if (snakeX[0]==foodx && snakeY[0]==foody){
                lenth ++;
                //重新生成食物
                foodx = 25 + 25*random.nextInt(34);
                foody = 75 + 25*random.nextInt(24);
            }


            //刷新界面
            repaint();
        }
        timer.start();      //让时间动起来
    }












    @Override
    public void keyReleased(KeyEvent keyEvent) {

    }
    @Override
    public void keyTyped(KeyEvent keyEvent) {

    }
}
